package com.wbao.dianniu.ui;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.arlen.photo.photopickup.util.DensityUtils;
import com.google.gson.JsonObject;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.umeng.analytics.MobclickAgent;
import com.wbao.dianniu.R;
import com.wbao.dianniu.logical.GlobalContext;
import com.wbao.dianniu.utils.PictureDownloadUtils;
import com.wbao.dianniu.utils.Utils;

import java.util.Hashtable;


/**
 * 我的二维码
 *
 * @author yejianjun
 */
public class MyQRCodeActivity extends BaseActivity {

    private ImageView userHead;
    private TextView userName;
    private TextView userLabel;
    private ImageView sexIV;
    private ImageView addV;
    private ImageView qrCodeImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentLayout(R.layout.my_qr_code, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        setTitleName(getResources().getString(R.string.my_qr_code));
        initView();
        initData();

    }

    private void initView() {
        userHead = (ImageView) findViewById(R.id.user_head);
        userName = (TextView) findViewById(R.id.user_name);
        userLabel = (TextView) findViewById(R.id.user_label);
        sexIV = (ImageView) findViewById(R.id.user_sex);
        addV = (ImageView) findViewById(R.id.add_v_iv);
        qrCodeImage = (ImageView) findViewById(R.id.qr_code_imageview);
    }

    private void initData() {
        userName.setText(GlobalContext.getNiceName() == null ? "" : GlobalContext.getNiceName());
        userLabel.setText(GlobalContext.getLabel() == null ? "" : GlobalContext.getLabel());
        PictureDownloadUtils.displayHeadImage(this, userHead, GlobalContext.getHeadPic());
        Utils.showSex(this, GlobalContext.getSex(), sexIV);
        if (GlobalContext.getIndustryAuthority()) {
            addV.setVisibility(View.VISIBLE);
        } else {
            addV.setVisibility(View.GONE);
        }
        // 二维码内容格式：{"accountId":"121212"}
        JsonObject ob = new JsonObject();
        ob.addProperty("accountId", String.valueOf(GlobalContext.getAccountId()));
        String sourse = ob.toString();
        if (!sourse.equals("")) {
            try {
                Bitmap bitmap = Create2DCode(sourse);
                qrCodeImage.setImageBitmap(createBitmap(bitmap, zoomBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 100, 100)));
            } catch (WriterException e) {
                e.printStackTrace();
            }
        }

    }

    public Bitmap Create2DCode(String str) throws WriterException {
//        Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hints.put(EncodeHintType.CHARACTER_SET, "GBK");
        // hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        int screen_width = DensityUtils.getWindowWidth(this);
        screen_width = screen_width - Utils.dip2px(this, 60);
        // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
        BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, screen_width, screen_width, hints);
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        // 二维矩阵转为一维像素数组,也就是一直横着排了
        int[] pixels = new int[width * height];
        for (int i = 0; i < pixels.length; i++) {
            pixels[i] = 0xffffffff;
        }
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (matrix.get(x, y)) {
                    pixels[y * width + x] = 0xff000000;
                }
            }
        }
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        // 通过像素数组生成bitmap,具体参考api
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

    /***
     * 合并图片
     *
     * @param src
     * @param watermark
     * @return
     */
    private Bitmap createBitmap(Bitmap src, Bitmap watermark) {
        String tag = "createBitmap";
        Log.d(tag, "create a new bitmap");
        if (src == null) {
            return null;
        }
        int w = src.getWidth();
        int h = src.getHeight();
        int ww = watermark.getWidth();
        int wh = watermark.getHeight();
        // create the new blank bitmap
        Bitmap newb = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
        Canvas cv = new Canvas(newb);
        // draw src into
        cv.drawBitmap(src, 0, 0, null);// 在 0，0坐标开始画入src
        // 在src的中间画watermark
        cv.drawBitmap(watermark, w / 2 - ww / 2, h / 2 - wh / 2, null);// 设置ic_launcher的位置
        // save all clip
        cv.save(Canvas.ALL_SAVE_FLAG);// 保存
        // store
        cv.restore();// 存储
        return newb;
    }

    /***
     * 缩放图片
     *
     * @param src
     * @param destWidth
     * @param destHeigth
     * @return
     */
    private Bitmap zoomBitmap(Bitmap src, int destWidth, int destHeigth) {
        String tag = "lessenBitmap";
        if (src == null) {
            return null;
        }
        int w = src.getWidth();// 源文件的大小
        int h = src.getHeight();
        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) destWidth) / w;// 宽度缩小比例
        float scaleHeight = ((float) destHeigth) / h;// 高度缩小比例
        Log.d(tag, "bitmap width is :" + w);
        Log.d(tag, "bitmap height is :" + h);
        Log.d(tag, "new width is :" + destWidth);
        Log.d(tag, "new height is :" + destHeigth);
        Log.d(tag, "scale width is :" + scaleWidth);
        Log.d(tag, "scale height is :" + scaleHeight);
        Matrix m = new Matrix();
        m.postScale(scaleWidth, scaleHeight);// 设置矩阵比例
        Bitmap resizedBitmap = Bitmap.createBitmap(src, 0, 0, w, h, m, true);// 直接按照矩阵的比例把源文件画入进行
        return resizedBitmap;
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch (v.getId()) {

            default:
                break;
        }

    }

    public void onResume() {
        super.onResume();
        MobclickAgent.onResume(this);
    }

    public void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
    }
}
